import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class SequenceManager {
    private List<Integer> nums = new ArrayList<>();

    //返回当前序列中缺失的最小正整数，并将该数添加到序列中
    //返回值：新添加到序列中的正整数
    //特性：保持序列严格递增
    Integer getNext(){
        if (nums.isEmpty()) {
            nums.add(1);
            return 1;
        }
        // 遍历序列，找到缺失的最小正整数
        int i;
        int ret = -1;
        for (i = 1; i < nums.size(); i++) {
            // 1  3 4 5
            // 1  2
            if (!Objects.equals(nums.get(i - 1) + 1, nums.get(i))) {
                // 说明找到缺失元素，添加进去
                nums.set(i, nums.get(i - 1) + 1);
                ret = nums.get(i - 1) + 1;
                i--;
            }
        }
        nums.add(nums.size() + 1);
        return ret == -1 ? i : ret;
    }

    // 将序列中的一个数字替换为另一个数字
    //参数：
    //oldNum：要替换的现有数字
    //newNum：替换后的新数字
    //约束条件：
    //oldNum 必须存在于序列中
    //newNum 不能存在于序列中
    //操作后序列仍保持严格递增
    void rename(Integer oldNum, Integer newNum) {
        if (nums.contains(newNum) || !nums.contains(oldNum)) return;

        // 遍历 nums 找到 oldNum，并替换
        for (int i = 0; i < nums.size(); i++) {
            if (nums.get(i).equals(oldNum)) {
                // 替换
                nums.set(i, newNum);
                return;
            }
        }
    }

    // 从序列中移除指定的数字
    //参数：要删除的数字
    //约束条件：待删除的数字必须存在于序列中
    void delete(Integer toDeleteNum) {
        // 不在序列中直接返回
        if (!nums.contains(toDeleteNum)) return;

        // 找到要删除的数字
        int i = 0;
        for ( ; i < nums.size(); i++) {
            if (nums.get(i).equals(toDeleteNum)) {
                break;
            }
        }
        // 存储之前元素
        List<Integer> tmp = new ArrayList<>();
        for (int j = 0; j <= nums.size(); j++) {
            if (j == i) {
                continue;
            }
            tmp.add(nums.get(j));
        }
        nums = tmp;
    }

    public static void main(String[] args) {
        SequenceManager sequenceManager = new SequenceManager();
        System.out.println(sequenceManager.getNext());
        System.out.println(sequenceManager.nums.toString());
        System.out.println(sequenceManager.getNext());
        System.out.println(sequenceManager.nums.toString());
        sequenceManager.rename(2, 3);
        System.out.println("rename" + sequenceManager.nums.toString());
        System.out.println(sequenceManager.getNext());
        System.out.println(sequenceManager.nums.toString());
        System.out.println(sequenceManager.getNext());
        System.out.println(sequenceManager.nums.toString());
    }

}
